#ifndef SYMBOLTABLE
#define SYMBOLTABLE

#include "ExpressionType.hpp"

#include <map>
#include <vector>

/**
	@brief niveau d'erreur

	niveau d'erreur sur la table des symboles (pour les exceptions de type Error)
*/
#define SYMBOLTABLE_LEVEL_ERROR			3

/**
	@class SymbolTable
	@brief classe de gestion des symboles locaux à un contexte d'exécution

	cette classe gère les symboles d'un contexte d'exécution (prog. principal, fonction, ...)
    elle défini pour un identificateur (donné via son indice dans la table des identificateurs)
      - sa classe (parametre de la fonction ou variable locale)
      - son type
*/
class SymbolTable
{
	public:
		/**
			@brief constructeur

			initialise la table des symboles
		*/
		SymbolTable ();
		/**
			@brief destructeur

			vide la table des symboles
		*/
		~SymbolTable ();
		/**
			@brief enregistrement d'un symbole

			enregistre un symbole dans la table des symboles
			@param [in] index l'index associé au symbole dans la table des identificateurs
		*/
		void registerSymbol ( unsigned int index );
		/**
			@brief accès à la catégorie d'un symbole

			accède à la catégorie d'un symbole : paramètre, variable, ...
			@param [in] index l'index de l'identificateur dans la table des identificateurs
			@return la catégorie du symbole
		*/
		SymbolClass getCategoryOf ( const unsigned int index ) const;
		/**
			@brief spécification de la catégorie d'un symbole

			initialise la catégorie d'un symbole : paramètre, variable, ...
			@param [in] index l'index de l'identificateur dans la table des identificateurs
			@param [in] category la catégorie du symbole
		*/
		void setCategoryOf ( const unsigned int index, const SymbolClass category );
		/**
			@brief accès au type d'un symbole

			accède au type d'un symbole : entier, ...
			@param [in] index l'index de l'identificateur dans la table des identificateurs
			@return le type du symbole
		*/
		Type getTypeOf ( const unsigned int index ) const;
		/**
			@brief spécification du type d'un symbole

			initialise le type d'un symbole : entier, ...
			@param [in] index l'index de l'identificateur dans la table des identificateurs
			@param [in] type le type du symbole
		*/
		void setTypeOf ( const unsigned int index, const Type type );
		/**
            @brief affichage de la table des symboles

            affiche, de façon lisible, les informations associées à cette table des symboles
        */
		void display () const;
	private:
        /// mapping position dans la table des identificateurs -> classe de symbole
		std::map < unsigned int, SymbolClass > _indexToCategory;
        /// mapping position dans la table des identificateurs -> type du symbole
		std::map < unsigned int, Type > _indexToType;
};

#endif
